package com.demo.weixin.pdf;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;

import java.io.File;
import java.io.IOException;


public class Test {
    public static void main(String[] args) {
//        try {

            String tmp = "C:\\Users\\Administrator\\Pictures\\资料\\实验室安全教育考试合格证(横版2020).pdf";
// 1. 解析PDF文本
//            try (PDDocument document = Loader.loadPDF(new File("C:\\Users\\Administrator\\Pictures\\资料\\实验室安全教育考试合格证(横版2020).pdf"))) {
//                PDFTextStripper stripper = new PDFTextStripper() {
//                    // 重写字体处理方法
//                    @Override
//                    protected void processTextPosition(TextPosition text) {
//                        // 强制指定编码（针对未嵌入字体的PDF）
//                        System.out.println("============"+text.getUnicode());
//                    }
//                };
//
//                stripper.setStartPage(1);
//                stripper.setEndPage(2);
//                String text = stripper.getText(document);
//                System.out.println(text);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        try (PDDocument doc = Loader.loadPDF(new File(tmp))) {
            PDPage page = doc.getPage(0);

            // 加载中文字体（需提供.ttf文件）
            PDType0Font font = PDType0Font.load(doc, new File("C:\\Users\\Administrator\\Pictures\\资料\\simsun.ttf"));

            try (PDPageContentStream cs = new PDPageContentStream(
                    doc, page,
                    PDPageContentStream.AppendMode.APPEND, true, true)) {




                // 填充姓名
                writeText(cs, font, 14, 450, 550, "张三");

                // 填充学号
                writeText(cs, font, 14, 150, 620, "20231001");

                // 填充日期和编号
                writeText(cs, font, 12, 400, 550, "2024年3月20日");
                writeText(cs, font, 12, 400, 530, "CER-2024-001");
            }
            doc.save("C:\\Users\\Administrator\\Pictures\\资料\\output_cert.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void writeText(PDPageContentStream cs, PDType0Font font,
                                  float fontSize, float x, float y, String text)
            throws IOException {
        cs.beginText();
        cs.setFont(font, fontSize);
        cs.newLineAtOffset(x, y);
        cs.showText(text);
        cs.endText();

        cs.setStrokingColor(1, 0, 0); // 红色参考线
        cs.moveTo(x, y);
        cs.lineTo(x + 100, y);
        cs.stroke();
    }
}
